//package com.serial;
//
//import java.lang.reflect.Array;
//import java.util.Arrays;
//import java.util.HashMap;
//
//import android.os.Handler;
//import android.util.Log;
//
//import com.friendlyarm.AndroidSDK.HardwareControler;
//import com.mini6410.DataPackage;
//import com.mini6410.MainActivity;
//
//public class SerialServer {
//	private static final String TAG = "SerialServer";
//
//	public static final String SERIAL_COM_DEFAULT = "/dev/s3c2410_serial2";
//	public static final String SERIAL_COM_0 = "/dev/s3c2410_serial0";
//	public static final String SERIAL_COM_1 = "/dev/s3c2410_serial1";
//	public static final String SERIAL_COM_2 = "/dev/s3c2410_serial2";
//	public static final String SERIAL_COM_3 = "/dev/s3c2410_serial3";
//	public static final String SERIAL_COM_4 = "/dev/s3c2410_serial4";
//	public static final String SERIAL_COM_5 = "/dev/s3c2410_serial5";
//
//	public static final long SERIAL_BAUD_RATE_DEFAULT = 115200;
//	public static final long SERIAL_BAUD_RATE_110 = 110;
//	public static final long SERIAL_BAUD_RATE_300 = 300;
//	public static final long SERIAL_BAUD_RATE_600 = 600;
//	public static final long SERIAL_BAUD_RATE_1200 = 1200;
//	public static final long SERIAL_BAUD_RATE_2400 = 2400;
//	public static final long SERIAL_BAUD_RATE_4800 = 4800;  //COŨ��
//	public static final long SERIAL_BAUD_RATE_9600 = 9600;  //�¶Ⱥ�PHֵ
//	public static final long SERIAL_BAUD_RATE_14400 = 14400;
//	public static final long SERIAL_BAUD_RATE_19200 = 19200;
//	public static final long SERIAL_BAUD_RATE_38400 = 38400;
//	public static final long SERIAL_BAUD_RATE_56000 = 56000;
//	public static final long SERIAL_BAUD_RATE_57600 = 57600;
//	public static final long SERIAL_BAUD_RATE_115200 = 115200;
//	public static final long SERIAL_BAUD_RATE_128000 = 128000;
//	public static final long SERIAL_BAUD_RATE_256000 = 256000;
//
//	public static final int SERIAL_DATA_BITS_DEFAULT = 8;
//	public static final int SERIAL_DATA_BITS_5 = 5;
//	public static final int SERIAL_DATA_BITS_6 = 6;
//	public static final int SERIAL_DATA_BITS_7 = 7;
//	public static final int SERIAL_DATA_BITS_8 = 8;
//
//	public static final int SERIAL_STOP_BITS_DEFAULT = 1;
//	public static final int SERIAL_STOP_BITS_1 = 1;
//	public static final int SERIAL_STOP_BITS_2 = 2;
//
//	public static final int SERIAL_DATA_SEND_PERIOD_DEFAULT = 500;
//	public static final int SERIAL_DATA_SEND_PERIOD_500 = 500;
//	public static final int SERIAL_DATA_SEND_PERIOD_1000 = 1000;
//	public static final int SERIAL_DATA_SEND_PERIOD_1500 = 1500;
//	public static final int SERIAL_DATA_SEND_PERIOD_2000 = 2000;
//
//	public static final byte[] SERIAL_COMMAND_GET_VALUE_CO = {(byte) 0x3A, (byte) 0x30, (byte) 0x31, (byte) 0x30, (byte) 0x33, (byte) 0x30,(byte) 0x32,(byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x41,(byte) 0x30,(byte) 0x39, (byte) 0x0D, (byte) 0x0A};
//	public static final byte[] SERIAL_COMMAND_GET_VALUE_PH_TEMPERATURE = {(byte) 0x02, (byte) 0x30, (byte) 0x31};
//
//
//	public static final int SERIAL_TYPE_CO = 0;
//	public static final int SERIAL_TYPE_PH_TEMPERATURE = 1;
//
//
//	/* �������BUF�ĳ��� */
//	public static final int SERIAL_BUF_LENGTH_DEFAULT = 20;
//
//	/* CO����Ũ�ȷ������BUF�ĳ��� */
//	public static final int SERIAL_BUF_LENGTH_CO = 16;
//
//	/* PH���¶�ֵ �������BUF�ĳ��� */
//	public static final int SERIAL_BUF_LENGTH_PH_TEMPERATURE = 11;
//
//	private String mdevName;
//	private long mbaud;
//	private int mdataBits;
//	private int mstopBits;
//	private int mtype;
//	private int mbuflength;
//	private byte[] mcommand; 
//
//	private HashMap<Byte, Integer> mHashMap = null;
//
//	private DataPackage mDataPackage = null;
//	private serialServerThread mserialServerThread = null;
//
//	Handler mHandler = null;
//
//	public SerialServer(Handler mHandler){
//		this.mHandler = mHandler;
//
//		mdevName = SERIAL_COM_2;
//		mbaud = SERIAL_BAUD_RATE_115200;
//		mdataBits = SERIAL_DATA_BITS_8;
//		mstopBits = SERIAL_STOP_BITS_1;
//
//		mDataPackage = new DataPackage();
//
//		buildHashMap();
//	}
//
//	public SerialServer(Handler mHandler,String devName, long baud, int dataBits, int stopBits){
//		this.mHandler = mHandler;
//
//		mdevName = devName;
//		mbaud = baud;
//		mdataBits = dataBits;
//		mstopBits = stopBits;
//
//		mDataPackage = new DataPackage();
//
//		buildHashMap();
//	}
//
//	public void setSerialServerType(int type){
//		mtype = type;
//
//		switch (mtype) {
//		case SERIAL_TYPE_CO:
//			mbuflength = SERIAL_BUF_LENGTH_CO;
//			mcommand = SERIAL_COMMAND_GET_VALUE_CO;
//			break;
//		case SERIAL_TYPE_PH_TEMPERATURE:
//			mbuflength = SERIAL_BUF_LENGTH_PH_TEMPERATURE;
//			mcommand = SERIAL_COMMAND_GET_VALUE_PH_TEMPERATURE;
//			break;			
//		default:
//			break;
//		}
//	}
//
//	public int getSerialServerType(){
//		return mtype;
//	}
//
//	public void buildHashMap(){
//		mHashMap = new HashMap<Byte, Integer>();
//
//		byte[] mkeys = {(byte)0x30,(byte)0x31,(byte)0x32,(byte)0x33,
//				(byte)0x34,(byte)0x35,(byte)0x36,(byte)0x37,
//				(byte)0x38,(byte)0x39,(byte)0x41,(byte)0x42,
//				(byte)0x43,(byte)0x44,(byte)0x45,(byte)0x46};
//		int[] mvalues = {(int)0x0,(int)0x1,(int)0x2,(int)0x3,
//				(int)0x4,(int)0x5,(int)0x6,(int)0x7,
//				(int)0x8,(int)0x9,(int)0xA,(int)0xB,
//				(int)0xC,(int)0xD,(int)0xE,(int)0xF};
//		
//		for(int i = 0; i < mkeys.length;i++){
//			mHashMap.put(mkeys[i], mvalues[i]);
//
//	}
//}
//
//public int getValue(byte key){
//	int value = 0;
//	Log.i("~~~~~~~~~~~~~~~~", String.valueOf(value)+"~~~~~~~0000000000~~~~~~~~~"+String.valueOf(key));
//
//	if (mHashMap != null) {
//		value = (Integer) mHashMap.get(key);
//	}
//
//	Log.i("~~~~~~~~~~~~~~~~", String.valueOf(value)+"~~~~~~~~~111111111111~~~~~~~"+String.valueOf(key));
//	return value;
//}
//
//public void start(){
//	safeStop();
//
//	mserialServerThread = new serialServerThread();
//	mserialServerThread.start();
//}
//
//public void safeStop(){
//	if(mserialServerThread != null && mserialServerThread.isAlive()){
//		mserialServerThread.interrupt();
//		mserialServerThread.stop = true;
//		try {
//			mserialServerThread.join();
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		}
//	}
//	mserialServerThread = null;
//}
//
//
//public void analyzeData(byte[] buf){
//	byte[] mbuf = buf;
//	//byte[] mbuf ={(byte)0x3A,(byte)0x30,(byte)0x31 ,(byte)0x30 ,(byte)0x33 ,(byte)0x30 ,(byte)0x32 ,(byte)0x30 ,(byte)0x30 ,(byte)0x37 ,(byte)0x32 ,(byte)0x31 ,(byte)0x41 ,(byte)0x0D ,(byte)0x0A ,(byte)0xFF};
//
//	Log.i("!!!!!!!!!!!!!!", String.valueOf(mbuf[7])+ " "+String.valueOf(mbuf[8])+ " "+String.valueOf(mbuf[9])+ " "+String.valueOf(mbuf[10]));
//	
//	switch (mtype) {
//	case SERIAL_TYPE_CO:
//		if(mbuf[0] == 0x3A && mbuf[1] == 0x30 && mbuf[2] == 0x31 && 
//		mbuf[3] == 0x30 && mbuf[4] == 0x33 && mbuf[5] == 0x30 && mbuf[6] == 0x32){
//			mDataPackage.mgas_concentration = (float) (getValue(mbuf[7])*Math.pow(16, 3)+ getValue(mbuf[8])*Math.pow(16, 2)+ getValue(mbuf[9])*Math.pow(16, 1)+ getValue(mbuf[10])*Math.pow(16, 0));
//		}
//
//		break;
//	case SERIAL_TYPE_PH_TEMPERATURE:
//		if(mbuf[0] == 0x32 && mbuf[1] == 0x30 && mbuf[2] == 0x31){
//			mDataPackage.mph_value = (float) (getValue(mbuf[3])*10 + getValue(mbuf[4])+ getValue(mbuf[5])*0.1 + getValue(mbuf[6])*0.01);
//			mDataPackage.mwater_temperature =  (float) (getValue(mbuf[7])*10 + getValue(mbuf[8])+ getValue(mbuf[9])*0.1);
//		}
//
//		break;
//	default:
//		break;
//	}
//}
//
//
//
//public void generateData(){
//	float random = (float) Math.random();
//	mDataPackage.mgas_concentration = 	random*10+0;
//	mDataPackage.mwater_temperature =   random*50+0;
//	mDataPackage.mph_value = (int)(random*14+0);
//}
//
//public void sendData(){
//	sendMessage(MainActivity.MSG_GET_DATA_SUCCESS,mtype,0, mDataPackage);
//}
//
//public void sendMessage(int what ){
//	if(mHandler != null){
//		mHandler.sendMessage(mHandler.obtainMessage(what));
//	}	
//}
//
//public void sendMessage(int what, Object obj ){
//	if(mHandler != null){
//		mHandler.sendMessage(mHandler.obtainMessage(what, obj));
//	}
//}
//
//public void sendMessage(int what, int arg1,int arg2,Object obj ){
//	if(mHandler != null){
//		mHandler.sendMessage(mHandler.obtainMessage(what,arg1,arg2,obj));
//	}
//}
//
//private class serialServerThread extends Thread{
//	volatile boolean stop = false;
//	private byte[] buf = new byte[mbuflength];
//	private byte[] buf1 = new byte[8];
//	private byte[] buf2 = new byte[8];
//	
//	private int fd = 0; //�ļ�������
//	int size = 0;
//	int ret = 0;
//
//
//	@Override
//	public void run() {
//
//		fd = HardwareControler.openSerialPort(mdevName, mbaud, mdataBits, mstopBits);
//
//		if(fd == -1)
//		{
//			Log.e(TAG, "Failed to open the serial port :" + mdevName);
//
//			stop = true;
//		}
//
//
//		while(!stop){
//
//			//Send Command To Get Data
//			if(mcommand != null){
//				HardwareControler.write(fd, mcommand);
//			}
//
//			//Check Whether The Serial Port Has Data
//			ret = HardwareControler.select(fd, 2, 1000*1000);
//			switch(ret){
//			case -1:
//				Log.e(TAG, "Error occurred when getting data!");
//				break;
//			case 0:
//				Log.i(TAG, "There is No Data!");
//				break;
//			case 1:
//			{	Arrays.fill(buf,(byte)0);
//				size = HardwareControler.read(fd, buf, buf.length);
//				
//				/*size = HardwareControler.read(fd, buf, buf.length);
//				for(int i = 0; i < buf.length; i++)
//				{
//					size += HardwareControler.read(fd, p, 1);
//					buf++;
//				}*/
//				
//				
//				Log.i("@@@@@@@@@@@", String.valueOf(size));
//				if(size == buf.length)
//				{
//					//generateData();
//					analyzeData(buf);
//					sendData();
//				}else if(size == 0){
//					Log.i(TAG, "There is No Data!");
//				}else if(size == -1){
//					Log.e(TAG, "Error occurred when getting data!");
//				}else{
//					Log.e(TAG, "Error occurred when getting data!");
//				}
//			}
//			break;
//			default:
//				break;
//			}
//
//			try {
//				Thread.sleep( SERIAL_DATA_SEND_PERIOD_500 );
//			} catch ( InterruptedException e ) {
//				e.printStackTrace();
//			}
//
//		}
//
//		if(fd != -1)
//		{
//			HardwareControler.close(fd);
//		}
//
//	}
//}
//}
